﻿// -----------------------------------------------------------------------
// <copyright file="GerenciadorPrestador.cs" company="Microsoft">
// TODO: Update copyright text.
// </copyright>
// -----------------------------------------------------------------------

namespace Service
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Persistence;
    using Model;

    /// <summary>
    /// TODO: Update summary.
    /// </summary>
    public class GerenciadorPrestador
    {


        private IUnitOfWork unitOfWork;
        private bool shared;

        /// <summary>
        /// Construtor pode ser acessado externamente e não compartilha contexto
        /// </summary>
        public GerenciadorPrestador()
        {
            this.unitOfWork = new UnitOfWork();
            shared = false;
        }

        /// <summary>
        /// Construtor acessado apenas dentro do componentes service e permite compartilhar
        /// contexto com outras classes de negócio
        /// </summary>
        /// <param name="unitOfWork"></param>
        internal GerenciadorPrestador(IUnitOfWork unitOfWork)
        {
            this.unitOfWork = unitOfWork;
            shared = true;
        }

        /// <summary>
        /// Insere um novo na base de dados
        /// </summary>
        /// <param name="prestador">Dados do modelo</param>
        /// <returns>Chave identificante na base</returns>
        public int Inserir(PrestadorModel prestador)
        {
            tb_prestador prestadorE = new tb_prestador();
            Atribuir(prestador, prestadorE);
            unitOfWork.RepositorioPrestador.Inserir(prestadorE);
            unitOfWork.Commit(shared);
            return prestadorE.id_prestador;
        }

        /// <summary>
        /// Altera dados na base de dados
        /// </summary>
        /// <param name="prestador"></param>
        public void Editar(PrestadorModel prestador)
        {
            tb_prestador prestadorE = new tb_prestador();
            Atribuir(prestador, prestadorE);
            unitOfWork.RepositorioPrestador.Editar(prestadorE);
            unitOfWork.Commit(shared);
        }

        public IQueryable<ClienteModel> obterIdCliente(string login) 
        {
           IQueryable<tb_cliente> tb_cliente = unitOfWork.RepositorioCliente.GetQueryable();
           var query = from clienteE in tb_cliente where clienteE.cliente_login.Equals(login) select new ClienteModel 
           {
             IDcliente=clienteE.id_cliente
           
           
           };
                      
            return query;
        }


        public IEnumerable<PrestadorModel> ObterIdPrestador(int idCliente)
        {
            return GetQuery().Where(prestador => prestador.idpCliente.Equals(idCliente));
        }

       

        /// <summary>
        /// Remove da base de dados
        /// </summary>
        /// <param name="prestador"></param>
        public void Remover(int idPrestador)
        {
            unitOfWork.RepositorioPrestador.Remover(prestadorE => prestadorE.id_prestador.Equals(idPrestador));
            unitOfWork.Commit(shared);
        }


        /// <summary>
        /// Consulta padrão para retornar dados do Serviço como model
        /// </summary>
        /// <returns></returns>
        private IQueryable<PrestadorModel> GetQuery()
        {
            IQueryable<tb_prestador> tb_prestador = unitOfWork.RepositorioPrestador.GetQueryable();
            var query = from prestadorE in tb_prestador
                        select new PrestadorModel
                        {
                            idpPrestador = prestadorE.id_prestador,
                            idpCliente  = prestadorE.id_cliente,
                            pcpf = prestadorE.prestador_cpf,
                            pcnpj = prestadorE.prestador_cnpj
                            

                        };
            return query;
        }

        /// <summary>
        /// Obter todos as entidades cadastradas
        /// </summary>
        /// <returns></returns>
        public IEnumerable<PrestadorModel> ObterTodos()
        {
            return GetQuery();
        }

        /// <summary>
        /// Obtém um Serviço
        /// </summary>
        /// <param name="id_servico">Identificador do serviço na base de dados</param>
        /// <returns>PrestadorModel</returns>
        public PrestadorModel Obter(int IDPrestador)
        {
            IEnumerable<PrestadorModel> prestador = GetQuery().Where(PrestadorModel => PrestadorModel.idpPrestador.Equals(IDPrestador));
            return prestador.ElementAtOrDefault(0);
        }

        /// <summary>
        /// Atribui dados do PrestadorModel para o tb_prestador Entity
        /// </summary>
        /// <param name="servico">Objeto do modelo</param>
        /// <param name="serE">Entity mapeada da base de dados</param>
        private void Atribuir(PrestadorModel prestador, tb_prestador prestadorE)
        {
            prestadorE.id_prestador = prestador.idpPrestador;
            prestadorE.prestador_cpf = prestador.pcpf;
            prestadorE.prestador_cnpj = prestador.pcnpj;
            prestadorE.id_cliente = prestador.idpCliente;
          
        }

       
    }
}
